Skip to content

feat(data-modeling): add endpoint lineage tab and metric scene polish - #110915

Merged
trunk-io[bot] merged 3 commits into
masterfrom
ux/data-modeling-ux-feedback
Oct 2, 2026
Merged

trunk-io[bot] merged 3 commits into
masterfrom
ux/data-modeling-ux-feedback

Conversation

@sakce

@sakce sakce commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Problem

Endpoint authors can't see which tables and models an endpoint reads from without leaving the endpoint page. The Metric scene also calls its checks tab "Tests" where every other scene says "Data quality", and it shows a bare spinner while loading.

Changes

  • Endpoints get a Lineage tab (and a "View lineage" menu bar item). It draws the graph around the viewed version's model, with that model highlighted.
  • The tab shows only when the viewed version has a materialized model. A version without one has no lineage to draw.
  • A failed load shows an error banner with Retry.
  • The Metric scene's "Tests" tab now reads "Data quality".
  • The data quality tab key is now data-quality on the Metric and node detail pages, and in notification links. Old tests links redirect to the new key.
  • The Metric scene shows a skeleton of the title, metadata and definition while it loads, in place of the spinner.

The tab looks up lineage by saved query id, which the lineage API already accepts. So the endpoints product needs no data modeling import and no extra node lookup.

endpoint-lineage-materialized

metric-data-quality-tab

How did you test this code?

  • Rendered both lineage states and the Metric tab bar on a devbox with demo data. Screenshots above.
  • Ran the endpoints, data catalog, data quality overview and node detail Jest suites, plus typescript:check, on the devbox.
  • The notifications pytest did not run on the devbox (its test database was in a broken state). CI covers it.
  • The skeleton was not captured: the load is too fast to screenshot locally.

Test rationale: No new tests. The tab is presentational over an existing API call, and the regression a unit test would catch (a zero-height graph container) is a layout issue only a render shows.

Release status

  • No feature flag controls this change
  • This change is behind a feature flag and is not available to users
  • This change makes a previously flagged feature available to everyone

The renamed tab only shows where data-quality-checks is already on, as before.

Automatic notifications

  • Publish to changelog?

Docs update

None.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Agent: Claude Code, Opus 5.5

  • Built on a devbox. Skills: /setting-up-devbox, /verifying-posthog-ui, /writing-pr-descriptions.
  • The CodeRabbit local pass is paused, so this PR opened without one.
  • The first render of the Lineage tab was blank: the graph relied on a flex parent that LemonTabs does not provide. It now has a fixed height.
  • Companion to chore(data-warehouse): remove data quality tab from data ops #110906, which removes the Data quality tab from Data Ops.

🤖 Generated with Claude Code

Add a lineage tab to the endpoint scene, rename the metric Tests tab
to Data quality, and replace the metric scene spinner with a skeleton.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@sakce sakce self-assigned this Oct 2, 2026
@sakce
sakce requested a review from thiagosalvatore October 2, 2026 14:57
@trunk-io

trunk-io Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

😎 Merged successfully - details.

@github-actions

github-actions Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

🤖 CI report

⚠️ Trunk lane — backend Python lane

This PR is assigned to the backend Python lane. It runs backend Python tests and may merge in parallel with PRs in other lanes.

⚠️ Complexity (TypeScript) — 11 functions above the limit (max 29)

Cyclomatic complexity above the limit in changed typescript files (10 for production files, 15 for test files). Warn only: worth simplifying when you next touch these functions.

Function Location Complexity Limit
EndpointScene products/endpoints/frontend/EndpointScene.tsx:70 29 10
DataCatalogMetricScene products/data_catalog/frontend/DataCatalogMetricScene.tsx:82 28 10
NodeDetailScene products/data_modeling/frontend/nodeDetail/NodeDetailScene.tsx:57 20 10
setViewingVersion products/endpoints/frontend/endpointSceneLogic.tsx:784 17 10
<anonymous> products/endpoints/frontend/endpointSceneLogic.tsx:861 17 10
OverviewBody products/data_modeling/frontend/ModelsOverviewTab.tsx:169 16 10
<anonymous> products/data_modeling/frontend/nodeDetail/nodeDetailSceneLogic.ts:479 12 10
MetricMetadata products/data_catalog/frontend/DataCatalogMetricScene.tsx:469 11 10
<anonymous> products/data_catalog/frontend/dataCatalogMetricSceneLogic.tsx:676 11 10
generateEndpointPayload products/endpoints/frontend/endpointSceneLogic.tsx:60 11 10
loadEndpointSuccess products/endpoints/frontend/endpointSceneLogic.tsx:666 11 10
✅ Duplication (Python) — clean

New Python code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

✅ Duplication (TypeScript) — clean

New TypeScript code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

⚠️ Bundle size — 🔺 +4.1 KiB (+0.0%)

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 69.76 MiB · 🔺 +4.1 KiB (+0.0%)

File Size Δ vs base
posthog-app/_parent/products/endpoints/frontend/EndpointScene.js 63.7 KiB 🔺 +2.4 KiB (+3.9%)
posthog-app/src/scenes/AuthenticatedShell.js 267.8 KiB 🔺 +1.1 KiB (+0.4%)

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

✅ Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1.63 MiB · 22 files 🔺 +253 B (+0.0%) █████████░ 88.7% of 1.84 MiB
logged-out boot: index + App + bootApp (preloaded by every page, including /login)
src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
3.72 MiB · 660 files 🔺 +253 B (+0.0%) █████████░ 92.3% of 4.03 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
7.59 MiB · 2,407 files 🔺 +2.9 KiB (+0.0%) █████████░ 91.0% of 8.34 MiB
dashboard scene
src/scenes/dashboard/Dashboard.tsx
9.66 MiB · 3,389 files 🔺 +253 B (+0.0%) ███████░░░ 71.7% of 13.48 MiB
today home path
src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
7.60 MiB · 2,415 files 🔺 +2.9 KiB (+0.0%) █████████░ 88.5% of 8.58 MiB
events scene
src/scenes/activity/explore/EventsScene.tsx
9.28 MiB · 3,241 files 🔺 +253 B (+0.0%) ███████░░░ 73.5% of 12.64 MiB
replay detail scene
src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
12.12 MiB · 4,129 files 🔺 +253 B (+0.0%) ████████░░ 77.1% of 15.72 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/layout/navigation-3000/navigationLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/scenes/dashboard/dashboardLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/lemon-ui/LemonMarkdown/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/RichContentEditor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/CodeSnippet/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/taxonomy/core-filter-definitions-by-group.json stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/scenes/project-homepage/today/TodayReportPage.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx

Largest files eagerly shipped from src/index.tsx
Size File
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
6.3 KiB ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js
4.5 KiB ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js
3.9 KiB ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js
1.4 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.3 KiB src/index.tsx
1.3 KiB src/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
854 B src/scenes/ChunkLoadErrorBoundary.tsx
Largest files eagerly shipped from src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
Size File
306.2 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
220.3 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
100.5 KiB src/lib/api.ts
92.5 KiB src/products.tsx
69.4 KiB src/lib/lemon-ui/icons/icons.tsx
40.1 KiB src/lib/utils/eventUsageLogic.ts
38.7 KiB ../node_modules/.pnpm/@dnd-kit+core@6.0.8_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@dnd-kit/core/dist/core.esm.js
33.9 KiB ../node_modules/.pnpm/kea@4.0.0-pre.6_patch_hash=139b8d1f1304f9d9da452a9a1244c94ea679dbcb85687d8999563146879fb6f5_react@18.3.1/node_modules/kea/lib/index.cjs.js
29.0 KiB ../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/schemas.js
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
306.2 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
279.9 KiB src/taxonomy/core-filter-definitions-by-group.json
220.3 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
110.0 KiB ../packages/quill/packages/quill/dist/index.js
100.5 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
92.5 KiB src/products.tsx
90.6 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
Largest files eagerly shipped from src/scenes/dashboard/Dashboard.tsx
Size File
306.2 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
279.9 KiB src/taxonomy/core-filter-definitions-by-group.json
220.3 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
181.8 KiB src/queries/validators.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
110.0 KiB ../packages/quill/packages/quill/dist/index.js
100.5 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
92.5 KiB src/products.tsx
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
Size File
306.2 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
279.9 KiB src/taxonomy/core-filter-definitions-by-group.json
220.3 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
110.0 KiB ../packages/quill/packages/quill/dist/index.js
100.5 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
92.5 KiB src/products.tsx
90.6 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
Largest files eagerly shipped from src/scenes/activity/explore/EventsScene.tsx
Size File
306.2 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
279.9 KiB src/taxonomy/core-filter-definitions-by-group.json
220.3 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
181.8 KiB src/queries/validators.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
110.0 KiB ../packages/quill/packages/quill/dist/index.js
100.5 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
92.5 KiB src/products.tsx
Largest files eagerly shipped from src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
Size File
315.5 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/rrweb.js
306.2 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
279.9 KiB src/taxonomy/core-filter-definitions-by-group.json
220.3 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
181.8 KiB src/queries/validators.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
110.0 KiB ../packages/quill/packages/quill/dist/index.js
100.5 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js

Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479

✅ Toolbar bundle — eager 2.20 MiB within budget

What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.

Metric Size Δ vs base Budget
Eager (shipped)
entry + static imports
2.20 MiB · 19 files no change ████░░░░░░ 38.4% of 5.72 MiB
Deferred (lazy) 2.11 MiB · 44 files no change n/a — loads on demand
Loader dist/toolbar.js 1.2 KiB no change █░░░░░░░░░ 6.0% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
834.2 KiB dist/toolbar/toolbar-app-LXAUZCP3.css
657.4 KiB dist/toolbar/chunk-chunk-PDXEE7YG.js
259.4 KiB dist/toolbar/chunk-chunk-EXS5VGKQ.js
138.2 KiB dist/toolbar/chunk-chunk-YTISI4G3.js
131.8 KiB dist/toolbar/chunk-chunk-FDH2IBXT.js
75.2 KiB dist/toolbar/toolbar-app-6G7F6XL7.js
69.0 KiB dist/toolbar/chunk-chunk-TSAL54PB.js
35.6 KiB dist/toolbar/chunk-chunk-U65TWWSR.js
21.0 KiB dist/toolbar/chunk-chunk-JYRTCG7P.js
6.8 KiB dist/toolbar/chunk-chunk-DV7IWQNF.js

Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile

✅ Dist folder size — 🔺 +64.4 KiB (+0.0%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 959.85 MiB · 🔺 +64.4 KiB (+0.0%)

⚠️ Playwright — 1 flaky

🎭 Playwright report · View test results →

⚠️ 1 flaky test:

  • create experiment via wizard, add metrics, and launch (chromium)

These issues are not necessarily caused by your changes.
Annoyed by this section? Help fix flakies and failures and it will go green!

@coderabbitai

coderabbitai Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

🧰 Additional context used
📚 Code guidelines (17)
.cursor/rules/react-typescript.mdc — auto-discovered
.agents/skills/using-kea-disposables/SKILL.md — configured
.agents/skills/writing-ui-components/SKILL.md — configured
.agents/security.md — configured
docs/published/handbook/engineering/type-system.md — configured
.agents/skills/writing-tests/SKILL.md — configured
products/endpoints/skills/auditing-endpoints/SKILL.md — configured
products/endpoints/skills/consuming-endpoints-from-client-code/SKILL.md — configured
products/endpoints/skills/copying-endpoints-across-projects/SKILL.md — configured
products/endpoints/skills/creating-an-endpoint/SKILL.md — configured
products/endpoints/skills/managing-endpoint-versions/SKILL.md — configured
.agents/skills/adopting-generated-api-types/SKILL.md — configured
.agents/skills/placing-product-frontend-code/SKILL.md — configured
.agents/skills/writing-kea-logics/SKILL.md — configured
.agents/skills/writing-user-facing-copy/SKILL.md — configured
… and 2 more

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: PostHog/posthog/.coderabbit.yaml

Review profile: QUIET

Plan: Enterprise

Run ID: 0de2ff18-16af-4a6d-b3b5-b55bc844b41d

📥 Commits

Reviewing files that changed from the base of the PR and between 7bdb907 and 8a96337.

📒 Files selected for processing (3)
  • products/data_modeling/frontend/nodeDetail/nodeDetailSceneLogic.ts
  • products/endpoints/frontend/endpoint-tabs/endpointLineageLogic.test.ts
  • products/endpoints/frontend/endpoint-tabs/endpointLineageLogic.ts

Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 7 remain after this review.


📝 Walkthrough

Walkthrough

The metric scene shows skeleton placeholders while a metric is loading and unavailable. Metric and node-detail data-quality tabs replace “Tests,” and legacy routes and related links use the updated tab name. Endpoint scenes add a Lineage tab and File-menu action when a saved query ID is available. The lineage view loads and displays the graph, with loading, missing-model, and failure states.

Priority: ➖ Normal

Merge Risk: 🔵 Low · up to 8a963

The data-quality tab rename and the endpoint lineage tab look sound and are covered by tests. One minor open concern remains: the no-lineage state may not offer a Configuration action as the PR objective describes. This is a small follow-up and does not block merging.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 8a963

The new lineage view uses existing project-scoped read permissions, and legacy tab links remain compatible. No introduced security issue was established. Overlapping requests and interrupted project or version transitions were not fully verified.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • observed — The lineage response contains the requested node and its reachable upstream and downstream graph, not merely the endpoint's immediate inputs. The inspected response path bounds this metadata disclosure to team-filtered nodes and edges.

Security Findings and Attack Paths

  • inferred — An attacker-supplied lineage identifier still encounters backend warehouse authorization and team-scoped resolution. The new UI caller does not establish a bypass of those existing controls; no introduced authorization or cross-team disclosure path was demonstrated.

Trust Boundaries and Controls

  • observed — Frontend tab eligibility is not the authorization boundary. The shared client sends the saved-query identifier through a project-scoped route, and the backend independently applies warehouse read permission and team filtering.

Resilience and Maintainability Implications

  • inferred — Distinct saved-query keys and failure-first rendering support identity separation and failure containment. Same-key overlapping completions, unmount interruption, and project-transition cleanup remain unresolved because framework lifecycle semantics and corresponding transition tests were not established. This is a coverage gap, not a verified disclosure.
🚥 Pre-merge checks | ✅ 1
✅ Passed checks (1 passed)
Check name Status Explanation
Description check ✅ Passed The description follows the required structure and clearly explains the endpoint lineage feature, data quality tab rename, loading skeleton, screenshots, testing scope, release status, and agent conte…
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
products/endpoints/frontend/endpoint-tabs/EndpointLineage.tsx (1)

23-23: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add data-attr to the new actions.

Give Open configuration, Retry, and Open the full graph distinct kebab-case data-attr values. Without them, the new interactions lack the selectors used by autocapture and UI tests.

As per coding guidelines, “New buttons and key interactive elements get a kebab-case data-attr.”

Also applies to: 42-42, 67-67

Source: Coding guidelines


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: PostHog/posthog/.coderabbit.yaml

Review profile: QUIET

Plan: Enterprise

Run ID: 556431dd-d95d-4bd2-bc4a-168cf94f426b

📥 Commits

Reviewing files that changed from the base of the PR and between dd3e22b and ee2555c.

📒 Files selected for processing (6)
  • products/data_catalog/frontend/DataCatalogMetricScene.tsx
  • products/data_catalog/frontend/tabs/MetricTestsTabLabel.tsx
  • products/endpoints/frontend/EndpointScene.tsx
  • products/endpoints/frontend/endpoint-tabs/EndpointLineage.tsx
  • products/endpoints/frontend/endpoint-tabs/endpointLineageLogic.ts
  • products/endpoints/frontend/endpointSceneLogic.tsx

Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 10 remain after this review.

@greptile-apps

greptile-apps Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Retrigger

[Medium risk] Renames a UI tab from tests to data-quality across multiple features.

The PR is not ready to merge: two unresolved repository requirements remain, alongside the endpoint tab URL mismatch.

Reviews (2) · Last reviewed commit: "feat(data-modeling): hide endpoint linea..."

@trunk-io

trunk-io Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

Static Badge   Static Badge   Static Badge

Failed Test Failure Summary Logs
Scenes/Code review Default play-test The test failed because a logic component was not mounted when accessed, and there were unhandled network requests intercepted by the mock service... Logs ↗︎
Experiment lifecycle › creation and launch › create experiment via wizard, add metrics, and launch The test failed because waiting for the URL to change timed out after 15 seconds. Logs ↗︎

View Full Report ↗︎ ⋅ Docs

… tests tab key

Show the endpoint lineage tab only for a materialized version, and use
data-quality as the tab key on metric and node detail pages. Old tests
links redirect to the new key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

Quiet mode is enabled, so only the most important comments were posted inline. Other review comments are grouped below.

🟡 Other comments (2)
products/endpoints/frontend/EndpointScene.tsx-274-277 (1)

274-277: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Preserve the viewed version in the File-menu Lineage link.

When the URL omits searchParams.version, endpointSceneLogic clears viewingVersion. This action sends only tab, so opening Lineage from an older version can switch to the current version.

Suggested fix
-                                            combineUrl(urls.endpoint(endpoint.name), { tab: EndpointTab.LINEAGE }).url
+                                            combineUrl(urls.endpoint(endpoint.name), {
+                                                ...router.values.searchParams,
+                                                tab: EndpointTab.LINEAGE,
+                                            }).url
products/endpoints/frontend/endpoint-tabs/EndpointLineage.tsx-30-32 (1)

30-32: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Add the Configuration action to the empty state.

When lineageMissing is true, EndpointLineage renders only the empty-state message. The Configuration action is therefore unavailable in this state. Add the Configuration button and preserve the viewed endpoint version in its destination.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: PostHog/posthog/.coderabbit.yaml

Review profile: QUIET

Plan: Enterprise

Run ID: 66879af4-8cf2-4434-a2f1-a2cf5ffdb29b

📥 Commits

Reviewing files that changed from the base of the PR and between ee2555c and 7bdb907.

📒 Files selected for processing (17)
  • frontend/src/products.tsx
  • products/data_catalog/frontend/DataCatalogMetricScene.tsx
  • products/data_catalog/frontend/dataCatalogMetricSceneLogic.test.ts
  • products/data_catalog/frontend/dataCatalogMetricSceneLogic.tsx
  • products/data_catalog/manifest.tsx
  • products/data_modeling/frontend/ModelsOverviewTab.tsx
  • products/data_modeling/frontend/nodeDetail/NodeDetailScene.tsx
  • products/data_modeling/frontend/nodeDetail/nodeDetailSceneLogic.test.ts
  • products/data_modeling/frontend/nodeDetail/nodeDetailSceneLogic.ts
  • products/data_quality/backend/logic/notifications.py
  • products/data_quality/backend/tests/test_notifications.py
  • products/data_quality/frontend/overview/DataQualityOverview.test.tsx
  • products/data_quality/frontend/overview/dataQualityOverviewLogic.test.ts
  • products/data_quality/frontend/overview/dataQualityOverviewLogic.ts
  • products/endpoints/frontend/EndpointScene.tsx
  • products/endpoints/frontend/endpoint-tabs/EndpointLineage.tsx
  • products/endpoints/frontend/endpoint-tabs/endpointLineageLogic.ts

Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 5 remain after this review.

@sakce
sakce marked this pull request as ready for review October 2, 2026 15:51
@parameterai

parameterai Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

Risk: No findings

The delta since the last review contains no runtime changes: reordered/tightened TypeScript type annotations in the node detail and endpoint lineage kea typegen blocks, and a new Jest suite for the endpoint lineage logic. No security-relevant behavior is added or altered.

Sentinel reviewed 8a96337 · Review settings

@github-actions

github-actions Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

🦔 Hogbox preview · ✅ ready

▶ Open the preview

🔑 Login test@posthog.com / 12345678 (demo data)
🧩 Running this PR's backend and frontend, on the PostHog :master base
🔗 Link stable across rebuilds — a re-push swaps the box underneath, the URL stays
🔒 Access tailnet only (PostHog VPN)
🛠️ Admin inspect & debug state in hogland
💤 Idle sleeps after ~30 min idle (snapshot to S3, zero node cost) and wakes on your next visit in ~30s, behind a brief "waking up" screen

commit 8a96337 · box box-f6837c22f7f8 · ready in 905s (push → usable) · build log · rebuilds on every push, torn down on close

@pr-assigner-resolver-posthog
pr-assigner-resolver-posthog Bot requested a review from a team October 2, 2026 15:52
The typechecking job regenerates kea types and then fails `git diff --exit-code`,
so the stale generated interfaces in these two logic files turned the job red and
took the frontend aggregate gate down with it.

Add logic tests for the new endpoint lineage tab: a 404 means the backing model has
no lineage node yet, any other failure is retryable, and the selector marks the
endpoint's own node in the graph.

Generated-By: PostHog Desktop
Task-Id: bbd6d56d-3db5-457c-abee-56be818ba72c

sakce commented Oct 2, 2026

Copy link
Copy Markdown
Contributor Author

/trunk merge

@sakce sakce added the stamphog Request AI approval (no full review) label Oct 2, 2026

@stamphog stamphog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Frontend-only UI change that adds a read-only lineage tab and renames a tab key, with redirects for the old tests links. It touches no risky territory, has logic tests, and the author is on the owning team. The only backend edit is one notification link string, which the frontend still resolves.

  • Author wrote 35% of the modified lines and has 109 merged PRs in these paths (familiarity MODERATE).
  • 👍 on the PR from greptile-apps[bot].
Gate mechanics and policy version
Gate Result
prerequisites ✓ all clear
deny-list ✓ no deny categories matched
size ✓ 282L, 14F substantive, 417L/20F incl. docs/generated/snapshots — within ceiling
tier ✓ T1-agent / T1d-complex (417L, 20F, two-areas, feat)
stamphog 2.3.1 .stamphog/policy.yml @ 8a96337 · reviewed head 8a96337

@trunk-io
trunk-io Bot merged commit cca97b5 into master Oct 2, 2026
@trunk-io
trunk-io Bot deleted the ux/data-modeling-ux-feedback branch October 2, 2026 22:55
@deployment-status-posthog

deployment-status-posthog Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-10-02 23:14 UTC Run
prod-us ✅ Deployed 2026-10-02 23:32 UTC Run
prod-eu ✅ Deployed 2026-10-02 23:34 UTC Run

This branch was successfully deployed

1 active deployment
preview-pr-110915 — 8a963378 Deployed Oct 2, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stamphog Request AI approval (no full review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant